/**
 * @file mobjbuf_ts.c
 *
 * @author yhuan416<yhuan416@foxmail.com>
 * @date 2025-10-03
 *
 * @brief 线程安全的 mobjbuf 包装器实现
 *          通过外部传递的临界区保护函数实现线程安全
 *
 * @note 线程安全部分保持相对独立，不修改原有 mobjbuf 代码
 */
#include "mobjbuf_ts.h"
#include <stdio.h>

/**
 * @brief 临界区保护宏
 */
#define MOBJBUF_TS_LOCK(_ts) \
    do { \
        if ((_ts)->lock_fn) { \
            (_ts)->lock_fn((_ts)->lock_userdata, true); \
        } \
    } while(0)

#define MOBJBUF_TS_UNLOCK(_ts) \
    do { \
        if ((_ts)->lock_fn) { \
            (_ts)->lock_fn((_ts)->lock_userdata, false); \
        } \
    } while(0)

/**
 * @brief 初始化线程安全内存池
 */
int mobjbuf_ts_init(mobjbuf_ts_t *ts_objbuf,
                    void *buffer,
                    size_t buf_size,
                    mobjbuf_ts_lock_fn lock_fn,
                    void *lock_userdata)
{
    if (ts_objbuf == NULL || buffer == NULL || buf_size == 0)
    {
        return -1;
    }

    // 初始化基础内存池
    if (mobjbuf_init(&ts_objbuf->objbuf, buffer, buf_size) != 0)
    {
        return -1;
    }

    // 设置线程安全相关参数
    ts_objbuf->lock_fn = lock_fn;
    ts_objbuf->lock_userdata = lock_userdata;

    return 0;
}

/**
 * @brief 线程安全分配内存
 */
void *mobjbuf_ts_alloc(mobjbuf_ts_t *ts_objbuf,
                      size_t size,
                      mobjbuf_discard_callback_fn discard_callback,
                      void *userdata)
{
    void *result = NULL;

    if (ts_objbuf == NULL || size == 0)
    {
        return NULL;
    }

    // 进入临界区
    MOBJBUF_TS_LOCK(ts_objbuf);

    // 调用基础分配函数
    result = mobjbuf_alloc(&ts_objbuf->objbuf, size, discard_callback, userdata);

    // 退出临界区
    MOBJBUF_TS_UNLOCK(ts_objbuf);

    return result;
}

/**
 * @brief 线程安全释放内存
 */
void mobjbuf_ts_free(mobjbuf_ts_t *ts_objbuf, void *ptr)
{
    if (ts_objbuf == NULL || ptr == NULL)
    {
        return;
    }

    // 进入临界区
    MOBJBUF_TS_LOCK(ts_objbuf);

    // 调用基础释放函数
    mobjbuf_free(&ts_objbuf->objbuf, ptr);

    // 退出临界区
    MOBJBUF_TS_UNLOCK(ts_objbuf);
}

/**
 * @brief 线程安全释放内存（不合并空闲块）
 */
void mobjbuf_ts_free_without_merge(mobjbuf_ts_t *ts_objbuf, void *ptr)
{
    if (ts_objbuf == NULL || ptr == NULL)
    {
        return;
    }

    // 进入临界区
    MOBJBUF_TS_LOCK(ts_objbuf);

    // 调用基础释放函数
    mobjbuf_free_without_merge(&ts_objbuf->objbuf, ptr);

    // 退出临界区
    MOBJBUF_TS_UNLOCK(ts_objbuf);
}

/**
 * @brief 线程安全合并所有空闲块
 */
void mobjbuf_ts_merge_free_blocks(mobjbuf_ts_t *ts_objbuf)
{
    if (ts_objbuf == NULL)
    {
        return;
    }

    // 进入临界区
    MOBJBUF_TS_LOCK(ts_objbuf);

    // 调用基础合并函数
    mobjbuf_merge_free_blocks(&ts_objbuf->objbuf);

    // 退出临界区
    MOBJBUF_TS_UNLOCK(ts_objbuf);
}

/**
 * @brief 线程安全打印内存池信息
 */
void mobjbuf_ts_dump(mobjbuf_ts_t *ts_objbuf)
{
    if (ts_objbuf == NULL)
    {
        printf("[mobjbuf_ts_dump] ts_objbuf is NULL!\n");
        return;
    }

    // 进入临界区
    MOBJBUF_TS_LOCK(ts_objbuf);

    // 调用基础打印函数
    mobjbuf_dump(&ts_objbuf->objbuf);

    // 退出临界区
    MOBJBUF_TS_UNLOCK(ts_objbuf);
}